﻿using System;
using System.Collections.Generic;
using Inventione.Framework.BusinessLogic.Exceptions;
using Inventione.Outsourcing.DataAccess;
using Inventione.Outsourcing.DataLinq;

namespace Inventione.Outsourcing.BusinessLogic
{
    public class BLContrato : Inventione.Framework.BusinessLogic.BLBase
    {
        // Representa o objeto de acesso a dados
        private DAContrato daContrato = null;

        /// <summary>
        /// Construtor padrão
        /// </summary>
        public BLContrato()
            : base("DEFAULT")
        {
            daContrato = new DAContrato("DEFAULT");
        }

        /// <summary>
        /// Construtor utilizando o cliente
        /// </summary>
        /// <param name="tenantId">Identificador do cliente</param>
        public BLContrato(string tenantId)
            : base(tenantId)
        {
            daContrato = new DAContrato(tenantId);
        }

        /// <summary>
        /// Consulta contratos (utilizando vários critérios opcionais)
        /// </summary>
        /// <param name="inAtivo">Indicador se está ativo ou inativo (S/N)</param>
        /// <param name="maximumRows">Quantidade máxima de linhas de retorno</param>
        /// <param name="startRowIndex">Linha inicial de retorno</param>
        /// <param name="sortExpression">Compo para ordenação</param>
        /// <returns>Lista de contratos</returns>
        public List<CONTRATO> consultarContratos(string nrContrato, DateTime? dtInicio, DateTime? dtFim, int cdEmpresaContratada, 
            int cdEmpresaContratante, string inAtivo, int maximumRows, int startRowIndex, string sortExpression)
        {
            List<CONTRATO> retorno = null;

            try
            {
                retorno = this.daContrato.consultarContratos(nrContrato, dtInicio, dtFim, cdEmpresaContratada, cdEmpresaContratante,
                    inAtivo, maximumRows, startRowIndex, sortExpression);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Consulta contratos (utilizando vários critérios opcionais)
        /// </summary>
        /// <param name="inAtivo">Indicador se está ativo ou inativo</param>
        /// <returns>Quantidade de registros atingidos pela consulta</returns>
        public int consultarContratosCount(string nrContrato, DateTime? dtInicio, DateTime? dtFim, int cdEmpresaContratada,
            int cdEmpresaContratante, string inAtivo)
        {
            int retorno = 0;

            try
            {
                retorno = daContrato.consultarContratosCount(nrContrato, dtInicio, dtFim, cdEmpresaContratada, cdEmpresaContratante,
                    inAtivo);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Obtem um contrato
        /// </summary>
        /// <param name="cdContrato">Código do contrato</param>
        /// <returns>Entidade contrato</returns>
        public CONTRATO obterContrato(int cdContrato)
        {
            CONTRATO retorno = null;

            try
            {
                retorno = daContrato.obterContrato(cdContrato);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Obtem um contrato
        /// </summary>
        /// <param name="cdContrato">Código do contrato</param>
        /// <returns>Lista contendo uma entidade contrato</returns>
        public List<CONTRATO> listarContrato(int cdContrato)
        {
            List<CONTRATO> retorno = null;

            try
            {
                retorno = this.daContrato.listarContrato(cdContrato);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Obtem um contrato
        /// </summary>
        /// <param name="nrContrato">Nº do contrato</param>
        /// <returns>Entidade de contrato</returns>
        public CONTRATO obterContrato(string nrContrato)
        {
            CONTRATO retorno = null;

            try
            {
                retorno = this.daContrato.obterContrato(nrContrato);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Lista os contratos vigentes
        /// </summary>
        /// <returns>Lista de contratos</returns>
        public List<CONTRATO> listarContratosVigentes()
        {
            List<CONTRATO> retorno = null;

            try
            {
                retorno = this.daContrato.listarContratosVigentes();
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Valida se um contrato esta ou estava em vigencia no periodo informado
        /// </summary>
        /// <param name="cdContrato">Código do contrato</param>
        /// <param name="dtInicio">Data de início do periodo</param>
        /// <param name="dtFim">Data fim do periodo</param>
        /// <returns>Se é valido ou não (true ou false)</returns>
        public bool validarVigencia(int cdContrato, DateTime dtInicio, DateTime dtFim)
        {
            bool retorno = false;

            try
            {
                retorno = this.daContrato.validarVigencia(cdContrato, dtInicio, dtFim);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Valida se um contrato esta ou estava em vigencia na data informado
        /// </summary>
        /// <param name="cdContrato">Código do contrato</param>
        /// <param name="dtBase">Data base</param>
        /// <returns>Se é valido ou não (true ou false)</returns>
        public bool validarVigencia(int cdContrato, DateTime dtBase)
        {
            bool retorno = false;

            try
            {
               retorno = this.daContrato.validarVigencia(cdContrato, dtBase);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        #region Métodos para Combos

        /// <summary>
        /// Lista os contratos ativos
        /// </summary>
        /// <returns>Lista de contratos</returns>
        public List<CONTRATO> listarContratosAtivos()
        {
            List<CONTRATO> retorno = null;

            try
            {
                retorno = this.daContrato.listarContratosAtivos();
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Lista números de contratos
        /// </summary>
        /// <param name="nrContrato">Parte do número do contrato</param>
        /// <returns>Lista de números de contratos</returns>
        public string[] listarNumeroContrato(string nrContrato)
        {
            string[] retorno = null;

            try
            {
                retorno = this.daContrato.listarNumeroContrato(nrContrato);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        #endregion


        #region Métodas básicos - CRUD

        /// <summary>
        /// Insere um contrato
        /// </summary>
        /// <param name="entity">Entidade contrato</param>
        /// <returns>Código do contrato</returns>
        public int inserirContrato(CONTRATO entity)
        {
            int retorno = 0;

            try
            {
                retorno = this.daContrato.inserirContrato(entity);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }

            return retorno;
        }

        /// <summary>
        /// Atualiza os dados de um contrato
        /// </summary>
        /// <param name="entity">Entidade contrato</param>
        public void atualizarContrato(CONTRATO entity)
        {
            try
            {
                this.daContrato.atualizarContrato(entity);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }
        }

        /// <summary>
        /// Exclui um contrato
        /// </summary>
        /// <param name="entity">Entidade contrato</param>
        public void excluirContrato(CONTRATO entity)
        {
            try
            {
                this.daContrato.excluirContrato(entity);
            }
            catch (Exception ex)
            {
                throw new BLException(ex, true);
            }
        }

        #endregion


    }
}
